#!/bin/bash
minFanSpeed=59; #минимальные обороты (от 0 до 255)

# график изменения оборотов для HDD
# температура=>скорость(% от max)
hddSet[38]=125;
hddSet[44]=169;
hddSet[47]=210;
hddSet[51]=255;

# график изменения оборотов для CPU
# температура=>скорость(% от max)
cpuSet[38]=59;
cpuSet[48]=66;
cpuSet[55]=100;
cpuSet[60]=160;
cpuSet[68]=255;


#выставляем скорость
function setFanSpeed {
    echo ${1} > /sys/class/hwmon/hwmon7/pwm3
}


function getMaxHddTemp {
     echo $(($(cat /sys/class/hwmon/hwmon[3,4,5,6]/temp1_input|sort -n|tail -1)/1000));
}

function getCpuTemp {
     echo $(($(cat /sys/class/hwmon/hwmon2/temp1_input)/1000))
}




function calcTempHdd {
prev=0;
for i in "${!hddSet[@]}"
do
        key=$i;
        val=${hddSet[$i]};

        #меньше первого значения
        if [[ $1 -lt $key && $prev -eq 0 ]]
        then
        ar=$2
            echo 0; return;
        fi;

        dots=${prev}":"${hddSet[$prev]}":"${key}":"${val};

        #меньше не первого значения
        if [[ $1 -lt $key && $prev -gt 0 ]]
        then
            echo $dots; return;
        fi;

        prev=$key;
done
echo $dots;
}

function calcTempCpu {
prev=0;

for i in "${!cpuSet[@]}"
do
        key=$i;
        val=${cpuSet[$i]};

        #меньше первого значения
        if [[ $1 -lt $key && $prev -eq 0 ]]
        then
        ar=$2
            echo 0; return;
        fi;

        dots=${prev}":"${cpuSet[$prev]}":"${key}":"${val};

        #меньше не первого значения
        if [[ $1 -lt $key && $prev -gt 0 ]]
        then
            echo $dots; return;
        fi;

        prev=$key;
done
echo $dots;
}


# аргументы [x1:y1:x2:y2, x], вернет Y=(kx+b)
function linear {
        dots=$1
        [[ "$dots" == "0" ]] && echo "0" && return;

        x1=$(echo $dots | cut -d ":" -f1);
        y1=$(echo $dots | cut -d ":" -f2);
        x2=$(echo $dots | cut -d ":" -f3);
        y2=$(echo $dots | cut -d ":" -f4);
        x=$2;


        # y=kx+b
        k=$(awk "BEGIN {printf \"%.2f\",(${y2}-${y1})/(${x2}-${x1})}");
        b=$(awk "BEGIN {printf \"%.2f\",(${y1}-(${k}*${x1}))}");
        y=$(awk "BEGIN {printf \"%.0f\",(${k}*${x})+(${b})}");

        #не больше 255
        [[ $y -ge 255 ]] && y=255;
        echo $y;
}



#составим таблицу скоростей для HDD
for ((i=0; i<101; i++))
do
        pwmSpeed=$(linear $(calcTempHdd $i) $i);
        if [[ $pwmSpeed -gt 0 ]]
        then
        echo "TempHDD:"$i" = "${pwmSpeed}"/255";
        fi;
        hddTable[$i]=$pwmSpeed;
done


#составим таблицу скоростей для процессора
for ((i=0; i<101; i++))
do
        pwmSpeed=$(linear $(calcTempCpu $i) $i);
        if [[ $pwmSpeed -gt 0 ]]
        then
        echo "TempCPU:"$i" = "${pwmSpeed}"/255";
        fi;
        cpuTable[$i]=$pwmSpeed;
done






#включаем ручное управление
echo 1 > /sys/class/hwmon/hwmon7/pwm3_enable
#ставим на максималку
echo 255 > /sys/class/hwmon/hwmon7/pwm3

while true
do
       hddTemp=$(getMaxHddTemp);
       cpuTemp=$(getCpuTemp);
       echo "TEMP hdd="${hddTemp}";cpu="${cpuTemp};
       echo "SPEED for hdd="${hddTable[$hddTemp]}/255";SPEED for cpu="${cpuTable[$cpuTemp]}"/255";
       
       [[ ${hddTable[$hddTemp]} -gt ${cpuTable[$cpuTemp]} ]] && needPWM=${hddTable[$hddTemp]} || needPWM=${cpuTable[$cpuTemp]};
      
       echo "set ${needPWM}/255";
       setFanSpeed $needPWM;

       echo "-------------------------------------------------";

       sleep 35
done